【Security Hub修復手順】[CodeBuild.2] CodeBuild プロジェクト環境変数にクリアテキストの認証情報を含めることはできません
こんにちは。AWS事業本部コンサルティング部に所属している今泉(@bun76235104)です。
皆さん、お使いのAWS環境のセキュリティチェックはしていますか?
当エントリでは、AWS Security HubによるAWS環境のセキュリティ状況スコアリングに該当する項目についての修正手順をご紹介します。
本記事の対象コントロール
[CodeBuild.2] CodeBuild プロジェクト環境変数にクリアテキストの認証情報を含めることはできません
[CodeBuild.2] CodeBuild project environment variables should not contain clear text credentials
前提条件
本記事はAWS Security Hubで「AWS基礎セキュリティのベストプラクティススタンダード」を利用されている方向けの内容となります。 AWS Security Hubの詳細についてはこちらのブログをご覧ください。
修正手順
1 是正対象のCodeBuild プロジェクトを特定する
まずAWS Security HubのコンソールからCodeBuild.2のチェック結果を確認します。是正対象のCodeBuild プロジェクトを確認できます。
2 IAMユーザーに代わるIAMロールを作成する
本コントロールはAWS_ACCESS_KEY_ID
またはAWS_SECRET_ACCESS_KEY
という環境変数をCodeBuildプロジェクトにクリアテキスト(プレーンテキスト)として持たせている場合に発生します。
つまりIAMユーザーを作成・アクセスキーとシークレットアクセスキーを発行することでCodeBuildプロジェクトにIAMユーザーの権限を利用させている可能性が高いです。
IAMロールを利用することでアクセスキー/シークレットアクセスキーを使わずにCodeBuildプロジェクトに権限を付与できます。
不要なアクセスキー発行・漏洩について以下記事が参考になりますのでご参照ください。
たとえば今回はCodeBuildプロジェクトで「DockerイメージをビルドしてECRにプッシュしたい」と仮定して、最小限の権限を付与するIAMロールを作成してみます。
※ 以下手順で作成しているIAMポリシーに付与している権限は一例となります。ご自身のCodeBuildプロジェクトで行いたいことに合わせて権限の設定が必要です
IAMポリシーの作成
まずはIAMロールに付与するIAMポリシーを作成します。
IAMのコンソール > 「ポリシー」 > 「ポリシーを作成」の順に進みます。
ポリシーのJSONを定義していきます。
今回は以下の権限を付与するために以下のようにJSONを定義しました。
- CodeBuildの実行ログをAmazon CloudWatch Logsに出力する
- CodeBuildの結果(アーティファクト)を特定のS3バケットに出力する
- ECRへのプッシュ
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": [ "arn:aws:logs:ap-northeast-1:<アカウントID>:log-group:/aws/codebuild/test-alarm", "arn:aws:logs:ap-northeast-1:<アカウントID>:log-group:/aws/codebuild/test-alarm:*" ], "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ] }, { "Effect": "Allow", "Resource": [ "arn:aws:s3:::<バケット名>" ], "Action": [ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:GetBucketAcl", "s3:GetBucketLocation" ] }, { "Effect": "Allow", "Action": [ "ecr:CompleteLayerUpload", "ecr:GetAuthorizationToken", "ecr:UploadLayerPart", "ecr:InitiateLayerUpload", "ecr:BatchCheckLayerAvailability", "ecr:PutImage" ], "Resource": "<特定のecrのarn>" } ] }
以下のプレースホルダーは環境に合わせて変更してください。
<アカウントID> <バケット名> <特定のecrのarn>
問題なければ「次のステップ:タグ」をクリックします。
特にタグは必要ないので、「次のステップ:確認」へ進みます。
「名前」にIAMポリシーの名前を入力します。
今回はtest-codebuild-project-policy
とし、「ポリシーの作成」をクリックします。
IAMロールの作成
詳細設定 - AWS CodeBuildの「CodeBuild サービスロールの作成」を参考にして以下のようにIAMロールを作成しました。
IAMのコンソール -> 「ロール」 -> 「ロールを作成」の順に進みます。
「信頼されたエンティティタイプ」として「AWSのサービス」を選択肢、「ユースケース」で「CodeBuild」を選択して「次へ」をクリックします。
許可ポリシーとして先ほど作成した「test-codebuild-project-policy」を検索して、チェックを有効にして「次へ」をクリックします。
ロール名をtest-codebuild-project-role
として入力して、「ロールを作成」をクリックします。
3 CodeBuildプロジェクトに作成したIAMロールを設定する
CodeBuildのコンソールから是正対象のプロジェクトを選択します。
次に「ビルドの詳細」タブをクリックして「環境」のブロックの「編集」をクリックします。
作成したIAMロールを設定する
「サービスロール」で先ほど作成したIAMロールを選択します。
クリアテキスト(プレーンテキスト)の環境変数を削除
「追加設定」のトグルを開いて、AWS_ACCESS_KEY_ID
とAWS_SECRET_ACCESS_KEY
の環境変数を削除しましょう。
あとは、画面最下部の「環境の更新」をクリックすれば是正完了です。
その他機密情報の設定方法
このコントロールではAWS_ACCESS_KEY_ID
とAWS_SECRET_ACCESS_KEY
という環境変数に起因するものであるため、IAMロールを利用する方法を紹介しました。
もちろんこれら以外の機密情報を環境変数としてクリアテキスト(プレーンテキスト)として保持してはいけません。
ビルド環境の環境変数 - AWS CodeBuildにも以下のように記述されています。
このコントロールのガイドでも記載されていますが、AWS Systems Manager Parameter StoreやAWS Secrets Managerを利用することでセキュアに機密情報をCodeBuildで取り扱えます。
CodeBuildプロジェクトへの設定方法については、少し古い記事ですが以下のブログが参考になると思います。
たとえば、こちらの記事では外部サービスのトークン情報をParameter Storeに設定しています。
Parameter StoreやSecrets Managerから読み込み場合はIAMロールに追加でIAMポリシーを付与するのも忘れないようにしましょう。
以下は、Parameter Storeの場合のIAMポリシーの一例です。
{ "Version": "2012-10-17", "Statement": [ "Effect": "Allow", "Action": [ "ssm:GetParameters", ], "Resource": [ "arn:aws::ssm:ap-northeast-1:xxxxxxxxx:parameter/SAMPLE" ] ] }
最後に
今回は、AWS Security HubによるAWS環境のセキュリティ状況スコアリングに該当する項目についての修正手順をご紹介しました。
コントロールを修正して、お使いのAWS環境のセキュリティをパワーアップさせましょう!
最後までお読みいただきありがとうございました!どなたかのお役に立てれば幸いです。
以上、今泉でした!